#ifndef __SOCKET_H__
#define __SOCKET_H__
#include <iostream>
#include <string>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
                                            
class Socket{	
	private:
		int sockfd;
		struct hostent *he;
		struct sockaddr_in their_addr;
		int log;
		int error;

	public:
		typedef unsigned short port_type;
	// Crea un socket que se conecta al servidor ’host’, puerto ’port’
	Socket(const std::string& host, port_type port);
	// Crea un socket que escucha conexiones en el puerto ’port’
	explicit Socket(port_type port,int backlog=5);
	// Envía datos por el socket
	int send(const std::string& buf);
	// Recibe datos del socket
	int recv(std::string& buf, size_t len);
	// Acepta unañueva conexión
	Socket* accept();
	// Para chequear si el socket es válido (por ej: if (socket) ...)
	operator bool () const;
	// Cierra y libera el socket
	~Socket();
	
	void sincroniza(std::string s);
	int sincroniza();

	private:
	// Constructor de copia y operator= ocultos (para prevenir descuidos)
	Socket(const Socket&);
	Socket& operator=(const Socket&);
	// Crea un socket a partir de un file descriptor (para el accept)
	Socket(int fd);
};
#endif
